using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel.Activation;
using Didsoft.Core.Exceptions;
using ICIA.ARojas.AccesoDatos.Entidades;
using ICIA.ARojas.AccesoDatos.Contexto;
using ICIA.ARojas.AccesoDatos.Contratos;
using ICIA.ARojas.Negocios.Servicios;


namespace ICIA.ARojas.Negocios
{
   /// <summary>
   /// Implementacion de la interface IDestinoFisicoNegociosServicio, los metodos que estan definidos en el contrato IDestinoFisicoNegociosServicio serán accesibles desde un contexto externo
   /// </summary>
   [WcfErrorBehavior]
   [WcfSilverlightFaultBehavior]
   [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]	
   public class DestinoFisicoNegocios : IDestinoFisicoNegociosServicio
   {
	private IDestinoFisicoAccesoDatos dataAccess;
	public DestinoFisicoNegocios() 
	{
		//dataAccess = Didsoft.Core.Factory.Singleton<DestinoFisicoAccesoDatos>.GetInstance();
		dataAccess = new DestinoFisicoAccesoDatos();
	}
	
	/// <summary>
    /// Devuelve una lista de DestinoFisico's de las ocurrencias encontradas a partir del filtro
    /// </summary>    
	public List<DestinoFisico> BuscarPorFiltro(string filtro)
	{
		return dataAccess.BuscarPorFiltro(filtro).ToList();
	}

    public List<DestinoFisico> ConstruirArbolPorNivel(int nivel)
    {
        return dataAccess.ConstruirArbolPorNivel(nivel);
    }


	#region operacione básicas
	
	/// <summary>
    /// Elimina la entidad DestinoFisico, lanzará una excepcion si la entidad guarda dependencia a otras entidades
    /// </summary>	
	public void Eliminar(DestinoFisico entidad)
	{
		dataAccess.Delete(entidad);
	}
	
	/// <summary>
    /// Devuelve DestinoFisico, buscada por su Id, si no existe, entonces devuelve null
    /// </summary>	
	public DestinoFisico ObtenerPorId(object Id)
	{
		return dataAccess.GetById(Id);
	}

	/// <summary>
    /// Devuelve List<DestinoFisico>, de todas la entidades de ese tipo
    /// </summary>	
	public List<DestinoFisico> ObtenerTodas()
	{
        //List<DestinoFisico> destinos = new List<DestinoFisico>();
        //for (int i = 0; i < 10; i++)
        //{
        //    DestinoFisico d = new DestinoFisico()
        //    {
        //        Codigo = "Codigo " + i,
        //        DestinoFisicoPadre = new DestinoFisico() { Codigo ="Padre "+i}
        //    };            
            
        //    destinos.Add(d);
        //}

        //return destinos;

		return dataAccess.GetAll().ToList();
	}


    public List<DestinoFisico> ObtenerHijosPorPadreId(int destinoPadreId)
    {
        return dataAccess.ObtenerHijosPorPadreId(destinoPadreId);
    
    }

	
	/// <summary>
    /// Guarda DestinoFisico, previa ejecucion satisfactoria de las reglas de negocio
    /// </summary>	
	public DestinoFisico Guardar(DestinoFisico entidad)
	{
		//Agregar aqui las reglas de negocio.......		
		if (entidad.Id == 0)
			dataAccess.Insert(entidad);
		else
			dataAccess.Update(entidad);

		return entidad;
	}

	#endregion
   }
}


